widget: Don't override state data when recursing to children
authorBenjamin Otte <otte@redhat.com>
Thu, 17 Mar 2011 15:45:19 +0000 (16:45 +0100)
committerBenjamin Otte <otte@redhat.com>
Thu, 17 Mar 2011 15:47:48 +0000 (16:47 +0100)
Writing onto the passed-in GtkStateData could cause changes that would
propagate to siblings, as the data was not reset again.
By copying the data structure, this is avoided and the proper values are
passed to sibling widgets.

gtk/gtkwidget.c

index 30d901c96e986c7a41b8d0c48a6255b58fb8608f..10f9effbd7a07b00bab7da5a07846e6af5fbf387 100644 (file)
@@ -11267,19 +11267,21 @@ gtk_widget_propagate_state (GtkWidget    *widget,
 
       if (GTK_IS_CONTAINER (widget))
         {
-          data->parent_sensitive = gtk_widget_is_sensitive (widget);
+          GtkStateData child_data = *data;
+
+          child_data.parent_sensitive = gtk_widget_is_sensitive (widget);
 
           /* Do not propagate focused state further */
-          data->flags &= ~GTK_STATE_FLAG_FOCUSED;
+          child_data.flags &= ~GTK_STATE_FLAG_FOCUSED;
 
-          if (data->use_forall)
+          if (child_data.use_forall)
             gtk_container_forall (GTK_CONTAINER (widget),
                                   (GtkCallback) gtk_widget_propagate_state,
-                                  data);
+                                  &child_data);
           else
             gtk_container_foreach (GTK_CONTAINER (widget),
                                    (GtkCallback) gtk_widget_propagate_state,
-                                   data);
+                                   &child_data);
         }
 
       /* Trigger state change transitions for the widget */